在開始介紹如何測試 repository 之前,要先帶過有使用的一些套件
本系列文章以 Rspec 作為測試用的框架,並且有使用 FactoryBot 來建立測資。
如此專案中的 repository 測試可以通用化成
# repository_spec.rb
RSpec.shared_examples 'a repository' do
describe '.save' do
it 'create record by entity' do
repo.save(entity)
actual_entity = repo.find_by_identity(identity)
expect(actual_entity.to_h).to include(entity.to_h)
end
end
describe '.destroy' do
it 'destroy record by identity' do
repo.save(entity)
repo.destroy(entity)
actual_entity = repo.find_by_identity(identity)
expect(actual_entity).to be_nil
end
end
end
而 domain 內的 repository 測試則寫成
# user_repository_spec.rb
require 'rails_helper'
RSpec.describe Repositories::Order do
it_behaves_like 'a repository' do
let(:entity) { build_entity }
let(:identity) { build_identity }
let(:repo) { described_class.new }
end
private
def build_entity
create(
:entity_order,
serial_number: 'ABC-1234567890',
status: :refunded,
puchased_at: Time.zone.now,
comment: '測試',
)
end
def build_identity
{
serial_number: 'ABC-1234567890',
}
end
end
# factory/order.rb
FactoryBot.define do
factory :entity_order, class: 'Entities::Order' do
serial_number { nil }
statu s{ nil }
puchased_at { nil }
comment { nil }
skip_create
initialize_with { new(attributes) }
end
這樣一來,只需要定義好 entity 測資,便可以快速地建立測試,降低建立基礎建設的時間。
下一篇將分享團隊討論過關於 DAL 的問題,以及目前的結論。